package com.dkd.system.utils;

import java.io.*;
import java.nio.file.*;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 增强版文件存储路径工具类
 */
public class StoragePathUtils {
    
    private StoragePathUtils() {}
    
    /**
     * 获取按年月日分级的存储路径
     * @param basePath 基础路径
     * @return 完整的存储路径
     */
    public static String getDateStructuredPath(String basePath) {
        String separator = FileSystems.getDefault().getSeparator();
        String datePath = new SimpleDateFormat("yyyy" + separator + "MM" + separator + "dd")
                            .format(new Date());
        Path fullPath = Paths.get(basePath, datePath);
        return fullPath.normalize().toString() + separator;
    }
    
    /**
     * 获取并创建按年月日分级的存储路径
     * @param basePath 基础路径
     * @return 完整的存储路径
     * @throws IOException 如果目录创建失败
     */
    public static String getAndCreateDateStructuredPath(String basePath) throws IOException {
        String fullPath = getDateStructuredPath(basePath);
        Files.createDirectories(Paths.get(fullPath));
        return fullPath;
    }
    
    /**
     * 获取按年月日分级的文件存储路径
     * @param basePath 基础路径
     * @param fileName 文件名
     * @return 完整的文件存储路径
     */
    public static String getDateStructuredFilePath(String basePath, String fileName) {
        String dirPath = getDateStructuredPath(basePath);
        return Paths.get(dirPath, fileName).normalize().toString();
    }
    
    /**
     * 获取并创建按年月日分级的文件存储路径
     * @param basePath 基础路径
     * @param fileName 文件名
     * @return 完整的文件存储路径
     * @throws IOException 如果目录创建失败
     */
    public static String getAndCreateDateStructuredFilePath(String basePath, String fileName) throws IOException {
        String dirPath = getAndCreateDateStructuredPath(basePath);
        return Paths.get(dirPath, fileName).normalize().toString();
    }
    
    /**
     * 存储文件流到按年月日分级的目录
     * @param basePath 基础路径
     * @param fileName 文件名
     * @param inputStream 文件输入流
     * @return 存储后的完整文件路径
     * @throws IOException 如果存储失败
     */
    public static String storeFileStream(String basePath, String fileName, InputStream inputStream) throws IOException {
        String filePath = getAndCreateDateStructuredFilePath(basePath, fileName);
        Files.copy(inputStream, Paths.get(filePath), StandardCopyOption.REPLACE_EXISTING);
        return filePath;
    }
    
    /**
     * 存储字节数组到按年月日分级的目录
     * @param basePath 基础路径
     * @param fileName 文件名
     * @param bytes 文件字节数组
     * @return 存储后的完整文件路径
     * @throws IOException 如果存储失败
     */
    public static String storeFileBytes(String basePath, String fileName, byte[] bytes) throws IOException {
        String filePath = getAndCreateDateStructuredFilePath(basePath, fileName);
        Files.write(Paths.get(filePath), bytes, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
        return filePath;
    }
    
    /**
     * 存储字符串内容到按年月日分级的目录
     * @param basePath 基础路径
     * @param fileName 文件名
     * @param content 文件内容字符串
     * @param charset 字符集
     * @return 存储后的完整文件路径
     * @throws IOException 如果存储失败
     */
    public static String storeFileContent(String basePath, String fileName, String content, String charset) throws IOException {
        return storeFileBytes(basePath, fileName, content.getBytes(charset));
    }
    
    /**
     * 存储字符串内容(UTF-8)到按年月日分级的目录
     * @param basePath 基础路径
     * @param fileName 文件名
     * @param content 文件内容字符串
     * @return 存储后的完整文件路径
     * @throws IOException 如果存储失败
     */
    public static String storeFileContent(String basePath, String fileName, String content) throws IOException {
        return storeFileContent(basePath, fileName, content, "UTF-8");
    }
}